home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / MARQUEE_ / MARQUEE.C < prev    next >
Text File  |  1990-07-16  |  3KB  |  113 lines

  1. /* marquee.c */
  2. #include "marquee.h"
  3.  
  4. typedef struct MarqueeRec {
  5.     struct MarqueeRec    *fNext;
  6.     int            fType;
  7.     Rect        fFromRect, fToRect;
  8.     BitMap        fBits;
  9.     int            fOffset;
  10.     int            fLeftMaximum;
  11.     long        fDelayTimer;
  12.     WindowPtr    fMarqueePort;
  13.     } MarqueeRec,*MarqueePtr;
  14.  
  15. QHdr    gMarqueeQueue;
  16.  
  17. BitMap    StringToBitMap (Str255 s, int h, int v, int descent);
  18.  
  19. /***************************/
  20. BitMap    StringToBitMap (Str255 s, int h, int v, int descent)
  21. {
  22.     GrafPtr        saved;
  23.     GrafPort    newPort;
  24.     Rect        r;
  25.  
  26.     GetPort(&saved);
  27.     OpenPort(&newPort);
  28.     SetRect(&r,0,0,h,v);
  29.     BlockMove( &r, &newPort.portRect, sizeof(Rect));
  30.  
  31.     RectRgn(newPort.visRgn, &r);
  32.     RectRgn(newPort.clipRgn, &r);
  33.     newPort.portBits.rowBytes = ((h + 15) / 16) * 2;
  34.     newPort.portBits.baseAddr = NewPtr( v * newPort.portBits.rowBytes );
  35.     BlockMove(&r,&newPort.portBits.bounds, sizeof(Rect));
  36.  
  37.     EraseRect(&r);
  38.     MoveTo(0, v - descent);
  39.     TextFont(saved->txFont);
  40.     TextFace(saved->txFace);
  41.     TextSize(saved->txSize);
  42.     DrawString(s);
  43.  
  44.     SetPort(saved);
  45.     return newPort.portBits;
  46. }
  47. /***************************/
  48. void MarqueeInit()
  49. {
  50.   gMarqueeQueue.qFlags = 0;
  51.   gMarqueeQueue.qHead = NIL;
  52.   gMarqueeQueue.qTail = NIL;
  53. }  
  54. /***************************/
  55. void MarqueeIdle( void )
  56. {
  57.     MarqueePtr    thisRec;
  58.     
  59.     thisRec = (MarqueePtr) gMarqueeQueue.qHead;
  60.     for ( ; thisRec != NIL; thisRec = thisRec->fNext )
  61.         if ( thisRec->fOffset != 0 && TickCount() > thisRec->fDelayTimer)
  62.             {
  63.             thisRec->fDelayTimer = TickCount() + 1;
  64.             
  65.             CopyBits( &thisRec->fBits, &thisRec->fMarqueePort->portBits,&thisRec->fFromRect, &thisRec->fToRect, srcCopy,NIL);
  66.             
  67.             if (thisRec->fFromRect.left + thisRec->fOffset < 0 || thisRec->fFromRect.left + thisRec->fOffset > thisRec->fLeftMaximum) 
  68.                 {
  69.                 thisRec->fOffset = -thisRec->fOffset;
  70.                 thisRec->fDelayTimer = TickCount() + 40;
  71.                 }
  72.             else
  73.                 OffsetRect(&thisRec->fFromRect, thisRec->fOffset, 0);
  74.             }
  75. }
  76. /***************************/
  77. void MarqueeDisplay (Str255 s, int displayWidth)
  78. {
  79.     int            sWidth, dH, lineHeight;
  80.     Point        curLoc;
  81.     FontInfo    fontstuff;
  82.     MarqueePtr    newRec;
  83.     
  84.     sWidth = StringWidth(s);
  85.     if (sWidth < displayWidth) 
  86.         {
  87.         Move( -(sWidth / 2), 0);
  88.         DrawString(s);
  89.          }
  90.     else
  91.         {
  92.         newRec = (MarqueePtr) (NewPtrClear( sizeof(MarqueeRec) + 4) + 4);
  93.         
  94.         GetFontInfo(&fontstuff);
  95.         lineHeight = fontstuff.ascent + fontstuff.descent + fontstuff.leading;
  96.         newRec->fBits = StringToBitMap(s, sWidth, lineHeight, fontstuff.descent);
  97.         
  98.         SetRect(&newRec->fFromRect, 0, 0, displayWidth, lineHeight);
  99.         BlockMove(&newRec->fFromRect,&newRec->fToRect, sizeof(Rect));
  100.         GetPen(&curLoc);
  101.         OffsetRect(&newRec->fToRect, curLoc.h - displayWidth / 2, curLoc.v - fontstuff.ascent);
  102.         InsetRect(&newRec->fToRect, -2, -2);
  103.         FrameRect(&newRec->fToRect);
  104.         InsetRect(&newRec->fToRect, 2, 2);
  105.         newRec->fLeftMaximum = sWidth - displayWidth;
  106.         newRec->fOffset = 1;
  107.         newRec->fDelayTimer = TickCount() + 1;
  108.         GetPort(&newRec->fMarqueePort);
  109.         
  110.         Enqueue( (QElemPtr) newRec, &gMarqueeQueue );
  111.          }
  112. }
  113.